home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
more_exa.tar
/
more
/
Fluids
/
lattice_gas.p
< prev
next >
Wrap
Text File
|
1992-08-28
|
126KB
|
3,808 lines
(****************************************************************************)
(*** ***)
(*** Program ILG 1.0: ***)
(*** Programming Language Parallaxis ***)
(*** ***)
(*** Author : Stefan Kolmar ***)
(*** Begin : Dezember 1991 ***)
(*** End : July 1992 ***)
(*** ***)
(*** Purpose: Program to simulate the kollision of fluids using ***)
(*** the Lattice - Gas - Theory ***)
(*** ***)
(*** ***)
(****************************************************************************)
system ilg_10;
const maxnet=128; (* Dimensions of the physical grid -> number of *)
(* processing Elements of the used Computer *)
(* MasPar: 16384 = 128 x 128 Processors *)
schnappschussausgabe = 'data/bilb0000.dat'; (* saving snapshot outp. *)
rotblauausgabe = 'data/rotblae0000.dat'; (* 2-bit Rasterfiles *)
vektorausgabe = 'data/vector0000.vff'; (* Vectorplots *)
aufsetzerfile = 'data/wo.dat'; (* loading snapshot-file *)
inputfile = 'galin.input'; (* Inputfile *)
controlfile = 'data/control.dat'; (* controlfile *)
virtuellepesx = 256; virtuellepesy = 256;
vfaktx = virtuellepesx div maxnet; vfakty = virtuellepesy div maxnet;
vfakt = vfaktx*vfakty;
iruh = 1; (* number of particels without velocity *)
offset15 = 2**15; offset4 = 2**4;
offset6 = 2**6;
wurzel3durch4 = sqrt(3.)/4.; wurzeldreidurch2 = sqrt(3.)/2.;
(* Zuordnungstabellen :*)
file1='tes70000.dat'; file1l=436; (* tes70000.dat -> 436 Lines*)
file2='tes70001.dat'; file2l=393; (* tes70001.dat -> 393 Lines*)
file3='tes70003.dat'; file3l=565; (* tes70003.dat -> 565 Lines*)
file4='tes70004.dat'; file4l=393; (* tes70004.dat -> 393 Lines*)
Impulstabelle = 'table.impulse';
Zuordtabelle = 'table.points';
Teilchentabelle = 'table.parts';
Kollisionstabelle1 = 'colt0000.dat';
Kollisionstabelle2 = 'colt0001.dat';
Kollisionstabelle3 = 'colt0003.dat';
Kollisionstabelle4 = 'colt0004.dat';
ausrechtsov = max(cardinal) - 3087; ausrechtsmv = max(cardinal) - 3;
auslinksmv = max(cardinal) - 1008; auslinksov = max(cardinal) - 192;
ausulein = max(cardinal) - 48; ausulro = max(cardinal) - 12;
ausulru = max(cardinal) - 60; ausolein = max(cardinal) - 768;
ausoro = max(cardinal) - 3072; ausoru = max(cardinal) - 3840;
maxAnzahlblasen = 5;
type impulstyp = record
impuls_x : integer;
impuls_y : integer;
end;
vectortyp = record
x_Richtung : real;
y_Richtung : real;
end;
card10 = array[1..10] of cardinal;
real10 = array[1..10] of real;
zustandstyp = array [0..895] of cardinal;
kolfeldtyp = array [0..3],[1..180] of cardinal;
teilimptyp = array [1..19],[1..36] of cardinal;
impulsfeldtyp = array [-4..4],[-2..2] of cardinal;
teilchenfeldtyp = array [0..7],[0..7] of cardinal;
stringtyp = array [1..16] of char;
string80 = array [1..80] of char;
string10 = array [1..10] of char;
rotblauteilchentyp = array[1..vfakt] of cardinal;
configuration hexagon[maxnet],[maxnet];
connection
rechts: hexagon[i,j] -> hexagon[i ,(j+1) mod maxnet ].links;
links : hexagon[i,j] -> hexagon[i ,(j-1) mod maxnet ].rechts;
oben_links: hexagon[i,j] -> hexagon[(i+1) mod maxnet,(j- i mod 2) mod maxnet ].unten_rechts;
unten_links: hexagon[i,j] -> hexagon[(i-1) mod maxnet,(j- i mod 2) mod maxnet ].oben_rechts;
oben_rechts: hexagon[i,j] -> hexagon[(i+1) mod maxnet,(j+ 1 - i mod 2) mod maxnet ].unten_links;
unten_rechts: hexagon[i,j] -> hexagon[(i-1) mod maxnet,(j+ 1 - i mod 2) mod maxnet ].oben_links;
(* global arrays : *)
vector Rote_Blaue_Teilchen, (* the real net with the nodes *)
anzahlrotblau : rotblauteilchentyp; (* the number of red and blue particels in one node *)
zustandstaball : zustandstyp; (* global statetable *)
kolfeldall : kolfeldtyp; (* global collisionstable *)
teilimpfeldall : teilimptyp; (* table representing particle x Impuls -> number *)
impulsfeldall : impulsfeldtyp; (* Impulsx x Impulsy -> number *)
teilchenfeldall : teilchenfeldtyp; (* red particles x blue particles -> number *)
scalar zaehlerglobal, anzahlblasen,
flaechen, anfangszeitpunkt,
endzeitpunkt, bildabstand,
anzahlgemitteltx, anzahlgemittelty,
bildabstandgesch, erstesbild,
erstesbildgesch : cardinal;
filestring : string80;
filezaehlers, filezaehlerrb,
filezaehlerv, filezaehlerhilf : [0..9999];
handle : integer;
geschwu0, geschwv0,
reddichte, anteilrot : real;
geschwx, geschwy,
dichtebl, dichteblr,
geschwxr, geschwyr : real10;
radius, mittelpunktx,
mittelpunkty, rechtecklinksuntenx,
rechtecklinksunteny, rechteckseitea,
rechteckseiteb : card10;
randoben, randunten,
randrechts, randlinks : string10;
(****************************************************************************)
(*** ***)
(*** Funktion BitwiseUND : ***)
(*** implements the Bitwise AND function ***)
(*** ***)
(****************************************************************************)
procedure BitwiseUnd (vector a,b,wieweit : cardinal): vector cardinal;
vector hilf, faktor,
zaehler : cardinal;
begin
faktor :=1;
hilf :=0;
for zaehler:=1 to wieweit+1 do
if ( odd(a) and odd(b) ) then
hilf := hilf + faktor;
end;
faktor := faktor + faktor;
a := a div 2;
b := b div 2;
end;
return(hilf);
end BitwiseUnd;
(****************************************************************************)
(*** ***)
(*** Funktion BitwiseOder : ***)
(*** implements the Bitwise OR function ***)
(*** ***)
(****************************************************************************)
procedure BitwiseOder (vector a,b : cardinal): vector cardinal;
vector hilf, faktor,
zaehler : cardinal;
begin
faktor :=1;
hilf :=0;
for zaehler:=1 to 14 do
if ( odd(a) or odd(b) ) then
hilf := hilf +faktor;
end;
faktor := faktor +faktor;
a := a div 2;
b := b div 2;
end;
return(hilf)
end BitwiseOder;
(****************************************************************************)
(*** ***)
(*** Funktion BitwiseXor : ***)
(*** implements the Bitwise XOR function ***)
(*** ***)
(****************************************************************************)
procedure BitwiseXor (vector a,b : cardinal): vector cardinal;
vector hilf, faktor,
zaehler : cardinal;
begin
faktor :=1;
hilf :=0;
for zaehler:=1 to 14 do
if (( odd(a) or odd(b) ) and not ( odd(a) and odd(b) ))
then
hilf := hilf +faktor
end;
faktor := faktor * 2;
a := a div 2;
b := b div 2;
end;
return(hilf);
end BitwiseXor;
(*****************************************************************************)
(*** ***)
(*** Prozedur anfangsbelegung : ***)
(*** implements the initial net ***)
(*** In a file the values of ***)
(*** anteilrot, geschwu0, geschwv0, geschwv, faktor, ***)
(*** dichtebewteil, dichteruheteil, gesamtdichte ***)
(*** are loaded and the initial values will be set ***)
(*** ***)
(*****************************************************************************)
procedure anfangsbelegung(scalar anzahlblasen,flaechen:cardinal;
scalar geschwu,geschwv,reddichte,anteilrote : real;
scalar geschwx,geschwy,dichtebl : real10;
scalar radius,mittelpunktx,mittelpunkty : card10;
scalar randoben,randunten,randrechts,randlinks : string10;
scalar rechtecklinksuntenx,rechtecklinksunteny,rechteckseitea,rechteckseiteb : card10;
scalar dichteblr,geschwxr,geschwyr : real10);
vector faktor : real;
vektoranf : record
anfangsbel0 : real;
anfangsbel1 : real;
anfangsbel2 : real;
anfangsbel3 : real;
anfangsbel4 : real;
anfangsbel5 : real;
anfangsbel6 : real;
end;
vrot : record
r0 : real;
r1 : real;
r2 : real;
r3 : real;
r4 : real;
r5 : real;
r6 : real;
end;
zufall, zufallnorm,
anteilrot : real;
zaehler1, zaehler2, zaehler3 : integer;
offsetv : cardinal;
hilfbool1, hilfbool2, hilfbool3,
hilfbool4, kein_rand : boolean;
scalar radiusy : array[1..maxAnzahlblasen] of cardinal;
zaehlerscal : cardinal;
xpos, ypos : card10;
blase, entmischung,
rechteck, rand : boolean;
vector geschwu0, geschwv0 :real;
begin
(* setting variables *)
(* Initialize *)
blase := false; rechteck := false;
entmischung := true;
if anzahlblasen>0 then blase := true;
entmischung := false;end;
if flaechen>0 then rechteck := true;
entmischung := false;end;
if blase then
for zaehlerscal := 1 to Anzahlblasen do
radiusy[zaehlerscal] := trunc(float(radius[zaehlerscal]) / (0.5 * sqrt(3.)));
xpos[zaehlerscal] := mittelpunktx[zaehlerscal];
ypos[zaehlerscal] := mittelpunkty[zaehlerscal];
end;
end;
parallel
anteilrot := anteilrote;
geschwu0 := geschwu;
geschwv0 := geschwv;
offsetv := 0;
for zaehler1 := 1 to vfakty do
for zaehler2 := 1 to vfaktx do
(* droplet *)
(* Ellipsenformel:
x**2/a**2 + y**2/b**2 <= 1 *)
if blase then
anteilrot := 1.;
geschwu0 := 0.;
geschwv0 := 0.;
reddichte := dichtebl[1];
for zaehlerscal:=1 to anzahlblasen do
if (float(DIM1+((vfakty-zaehler1)*maxnet)-ypos[zaehlerscal])**2
/ float(radiusy[zaehlerscal])**2
+ float(DIM2+((zaehler2-1)*maxnet)-xpos[zaehlerscal])**2
/ float(radius[zaehlerscal])**2 <= 1.) then
geschwu0 := geschwx[zaehlerscal];
geschwv0 := geschwy[zaehlerscal];
anteilrot := 0.;
reddichte := dichtebl[zaehlerscal];
end;
end;
end;
(* Rechteck *)
if rechteck then
anteilrot := 1.;
geschwu0:=0.;
geschwv0:=0.;
reddichte := dichteblr[1];
for zaehlerscal:=1 to flaechen do
if ((0 <= (dim2)+((zaehler2-1)*maxnet) <= rechtecklinksuntenx[zaehlerscal])
or ((rechtecklinksuntenx[zaehlerscal] + rechteckseitea[zaehlerscal])
<= ((dim2)+((zaehler2-1)*maxnet)) <= virtuellepesx)
or (0 <= (dim1)+((vfakty-zaehler1)*maxnet)
<= rechtecklinksunteny[zaehlerscal])
or (rechtecklinksunteny[zaehlerscal]+rechteckseiteb[zaehlerscal]
<= (dim1)+((vfakty-zaehler1)*maxnet) <= virtuellepesy)) then
geschwu0 := geschwxr[zaehlerscal];
geschwv0 := geschwyr[zaehlerscal];
reddichte := dichteblr[zaehlerscal];
anteilrot := 0.;
end;
end;
end;
faktor := 2. * (float(iruh) + 6. ) / 6.;
vektoranf.anfangsbel0 := reddichte;
vektoranf.anfangsbel1 := reddichte *
( 1.0 + faktor * geschwu0);
vektoranf.anfangsbel2 := reddichte *
( 1.0 + faktor * (geschwu0*0.5 + geschwv0 * wurzeldreidurch2));
vektoranf.anfangsbel3 := reddichte *
( 1.0 + faktor * (-geschwu0*0.5 + geschwv0 * wurzeldreidurch2));
vektoranf.anfangsbel4 := reddichte *
( 1.0 - faktor * geschwu0);
vektoranf.anfangsbel5 := reddichte *
( 1.0 - faktor * (geschwu0*0.5 + geschwv0 * wurzeldreidurch2));
vektoranf.anfangsbel6 := reddichte *
( 1.0 + faktor * (geschwu0*0.5 - geschwv0 * wurzeldreidurch2));
vrot.r0 := vektoranf.anfangsbel0 * anteilrot;
vrot.r1 := vektoranf.anfangsbel1 * anteilrot;
vrot.r2 := vektoranf.anfangsbel2 * anteilrot;
vrot.r3 := vektoranf.anfangsbel3 * anteilrot;
vrot.r4 := vektoranf.anfangsbel4 * anteilrot;
vrot.r5 := vektoranf.anfangsbel5 * anteilrot;
vrot.r6 := vektoranf.anfangsbel6 * anteilrot;
zaehler3 := zaehler2+offsetv;
Rote_Blaue_Teilchen[zaehler3] := 0;
(* anfangsbelegungX : Wahrscheinlichkeit, dass eine Zelle belegt ist *)
(* Anteilrot : wird vorgegeben *)
(* Algorithmus : Ist anfangsbelegungX > erzeugte Zufallszahl ? *)
(* Ja : Zelle wird mit einem Teilchen besetzt *)
(* vrot.rX > Zufallszahl ? *)
(* Ja : Zelle mit Rot belegen *)
(* Nein : Zelle mit Blau belegen *)
(* Belegung des 32 - Bit Wortes Rote_Blaue_Teilchen : *)
(* |--|--|r0|b0|r6|b6|r5|b5|r4|b4|r3|b3|r2|b2|r1|b1| *)
(* Parallel fuer jedes PE eine Zufallszahl erzeugen *)
hilfbool1 := (DIM1<>0) or (zaehler3 <= (vfakt-vfaktx)) or (randunten='RING');
hilfbool2 := (DIM1<>maxnet-1) or (zaehler3>= vfaktx) or (randoben='RING');
hilfbool3 := (DIM2<>0) or (zaehler3 mod vfaktx<>1) or (DIM1 mod 2 = 1)
or (randlinks='RING');
hilfbool4 := (DIM2<>maxnet-1) or (zaehler3 mod vfaktx<>0) or (DIM1 mod 2 = 1)
or (randrechts='RING');
if (hilfbool1 and hilfbool2 and hilfbool3 and hilfbool4) then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel0 > zufall then
if vrot.r0 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+8192;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+4096;
end;
end;
end;
if hilfbool4 then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel1 > zufall then
if vrot.r1 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+2;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+1;
end;
end;
end;
if (hilfbool3 and hilfbool4) then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel2 > zufall then
if vrot.r2 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+8;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+4;
end;
end;
end;
if (hilfbool2 and hilfbool3) then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel3 > zufall then
if vrot.r3 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+32;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+16;
end;
end;
end;
if hilfbool3 then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel4 > zufall then
if vrot.r4 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+128;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+64;
end;
end;
end;
if (hilfbool3 and hilfbool1) then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel5 > zufall then
if vrot.r5 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+512;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+256;
end;
end;
end;
if (hilfbool1 and hilfbool4) then
zufall := vrrandom();
zufall := zufall / float(max(cardinal));
if vektoranf.anfangsbel6 > zufall then
if vrot.r6 > zufall
then Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+2048;
else Rote_Blaue_Teilchen[zaehler3] :=
Rote_Blaue_Teilchen[zaehler3]+1024;
end;
end;
end;
end; (* for *)
offsetv := offsetv + vfaktx;
end (* for *)
endparallel;
end anfangsbelegung;
(***************************************************************************)
(*** ***)
(*** Prozedur Fortbewegung ***)
(*** implements the migration in the net ***)
(*** ***)
(***************************************************************************)
procedure fortbewegung;
vector uebergabeteilchen , ausblenden,
besetzt, belegt,
offsetv, zaehler1,
zaehler2, shiftchar,
shiftchar2x, uebergabenetz,
index, indexold,
indexh, indexhold,
obereGr, untereGr : cardinal;
zaehlerfort, zaehlerfort1 : integer;
hilfrotblau : array[1..vfakt] of cardinal;
begin
parallel
zaehlerfort1 := 1;
for zaehler1 := 1 to vfaktx do
for zaehler2 := 1 to vfakty do
uebergabenetz := 0;
uebergabeteilchen := 0;
shiftchar := 1;
shiftchar2x := 2 * shiftchar;
for zaehlerfort := 1 to 6 do
if odd(Rote_Blaue_Teilchen[zaehlerfort1] div shiftchar) then
uebergabeteilchen := shiftchar;
Rote_Blaue_Teilchen[zaehlerfort1] := Rote_Blaue_Teilchen[zaehlerfort1] - shiftchar;
else if odd(Rote_Blaue_Teilchen[zaehlerfort1] div shiftchar2x) then
uebergabeteilchen := shiftchar2x;
Rote_Blaue_Teilchen[zaehlerfort1] := Rote_Blaue_Teilchen[zaehlerfort1] - shiftchar2x;end;
end;
case shiftchar of
1 : propagate.rechts(uebergabeteilchen) |
4 : propagate.oben_rechts(uebergabeteilchen) |
16 : propagate.oben_links(uebergabeteilchen) |
64 : propagate.links(uebergabeteilchen) |
256 : propagate.unten_links(uebergabeteilchen) |
1024 : propagate.unten_rechts(uebergabeteilchen) ;
end;(* case *)
uebergabenetz:= uebergabenetz + uebergabeteilchen;
uebergabeteilchen := 0;
shiftchar := shiftchar * 4;
shiftchar2x := 2 * shiftchar;
end;(* for zaehlerfort*)
(* Ruheteilchen bleiben *)
Rote_Blaue_Teilchen[zaehlerfort1] := Rote_Blaue_Teilchen[zaehlerfort1] + uebergabenetz;
inc(zaehlerfort1);
end; (* for zaehler2 *)
end; (* for zaehler1*)
if (vfaktx >1) or (vfakty >1) then
(* Ausgleichen der Fortbewegung *)
(* Initialize *)
for zaehler1:=1 to vfakt do
hilfrotblau[zaehler1] := 0;
end; (* for *)
offsetv := 0;
(* rechter Rand mit Versatz, r1b1r2b2r6b6 *)
if (DIM2 = 0) and (DIM1 mod 2 = 1) then
ausblenden := ausrechtsov;
besetzt := 3087;
end;
(* rechter Rand ohne Versatz, r1b1 *)
if (DIM2 = 0) and (DIM1 mod 2 = 0) then
ausblenden := ausrechtsmv;
besetzt := 3;
end;
(* (* rechter Rand untere Ecke, r1b1r2b2 *)
if (DIM2 = 0) and (DIM1 = 0) then
ausblenden := max(cardinal) - 15;
besetzt := 15;
end;*)
(* linker Rand ohne Versatz, r3b3r4b4r5b5 *)
if (DIM2 = maxnet-1) and (DIM1 mod 2 = 0) then
ausblenden := auslinksmv;
besetzt := 1008;
end;
(* linker Rand mit Versatz, r4b4 *)
if (DIM2 = maxnet-1) and (DIM1 mod 2 = 1) then
ausblenden := auslinksov;
besetzt := 192;
end;
(* (* linke obere Ecke, r4b4r5b5 *)
if (DIM2 = maxnet-1) and (DIM1 = maxnet-1) then
ausblenden := max(cardinal) - 960;
besetzt := 960;
end; *)
if (DIM2 = 0) or (DIM2 = maxnet-1) then
offsetv := 0;
for zaehlerfort := 1 to vfakty do
index := offsetv;
for zaehlerfort1 := 1 to vfaktx do
inc(index);
hilfrotblau[index] := BitwiseUnd(Rote_Blaue_Teilchen[index],besetzt,14);
end; (* for zaehlerfort1 *)
offsetv := offsetv + vfaktx;
end; (* for zaehlerfort *)
end; (* if *)
(* rechter Rand *)
offsetv := 0;
if (DIM2 = 0) then
untereGr := 2;
obereGr := vfaktx;
end;
(* linker Rand *)
if (DIM2 = maxnet-1) then
untereGr := 1;
obereGr := vfaktx-1;
end;
if (DIM2 = 0) or (DIM2 = maxnet-1) then
offsetv := 0;
for zaehlerfort1 := 1 to vfakty do
index := offsetv + untereGr -1;
if (DIM2 = 0) then
indexh := index - 1;
end;
if (DIM2 = maxnet-1) then
indexh := index + 1;
end;
for zaehlerfort := untereGr to obereGr do
inc(index);
inc(indexh);
Rote_Blaue_Teilchen[index] :=
BitwiseUnd(Rote_Blaue_Teilchen[index],ausblenden,14);
Rote_Blaue_Teilchen[index] := Rote_Blaue_Teilchen[index] + hilfrotblau[indexh];
end; (* for zaehlerfort *)
offsetv := offsetv + vfaktx;
end; (* for zaehlerfort1 *)
if (DIM2 = 0) then
index := 1;
indexh:= vfaktx;
end;
if (DIM2 = maxnet-1) then
index := vfaktx;
indexh := 1;
end;
for zaehlerfort := 1 to vfakty do
Rote_Blaue_Teilchen[index] :=
BitwiseUnd(Rote_Blaue_Teilchen[index],ausblenden,14);
Rote_Blaue_Teilchen[index] :=
Rote_Blaue_Teilchen[index] + hilfrotblau[indexh];
index := index+vfaktx;
indexh:= indexh+vfaktx;
end; (* for *)
end; (* if *)
offsetv := 0;
(* unterer Rand r2b2 und r3b3 *)
if (DIM1 = 0) then
ausblenden := ausulru;
besetzt := 60;
end; (* if *)
(* oberer Rand r5b5 und r6b6 *)
if (DIM1 = maxnet-1) then
ausblenden := ausoru;
besetzt := 3840;
end;(* if *)
if (DIM1 = maxnet-1) or (DIM1 = 0) then
for zaehlerfort1 := 1 to vfakty do
index := offsetv;
for zaehlerfort := 1 to vfaktx do
inc(index);
hilfrotblau[index] := bitwiseund(Rote_Blaue_Teilchen[index],besetzt,14);
end;
offsetv:=offsetv + vfaktx;
end; (* for *)
if (DIM1 = 0) then
offsetv := 0;
end;
if (DIM1 = maxnet-1) then
offsetv := vfaktx;
end;
for zaehlerfort1 := 1 to vfakty-1 do
index:= offsetv;
if (DIM1 = 0) then
indexh := index + vfaktx;
end;
if (DIM1 = maxnet-1) then
indexh := index - vfaktx;
end;
for zaehlerfort := 1 to vfaktx do
inc(index);
inc(indexh);
Rote_Blaue_Teilchen[index] :=
BitwiseUnd(Rote_Blaue_Teilchen[index],ausblenden,14);
Rote_Blaue_Teilchen[index] :=
Rote_Blaue_Teilchen[index] +hilfrotblau[indexh];
end;
offsetv := offsetv + vfaktx;
end; (* for *)
if (DIM1 = 0) then
index := vfaktx*(vfakty-1);
indexh := 0;
end;
if (DIM1 = maxnet-1) then
index := 0;
indexh := vfaktx*(vfakty-1);
end;
for zaehlerfort := 1 to vfakty do
inc(index);
inc(indexh);
Rote_Blaue_Teilchen[index] :=
BitwiseUnd(Rote_Blaue_Teilchen[index],ausblenden,14);
Rote_Blaue_Teilchen[index] :=
Rote_Blaue_Teilchen[index] + hilfrotblau[indexh];
end;(* for *)
end; (* if *) (* ok *)
end; (* if *)
endparallel;
end fortbewegung;
(***************************************************************************)
(*** ***)
(*** Prozedur Farbfeld ***)
(*** implements the local colour-field ***)
(*** ***)
(***************************************************************************)
procedure Farbfeld(vector zaehlerff : cardinal) : vector cardinal;
vector uebergabeteilchenrot, uebergabeteilchenblau,
durchlauf, shiftcardinal,
shifthilf, phicardinal,
zaehler0, zaehler1, zaehler2,
zaehler3, zaehler4, zaehler5,
zaehler6, zaehler7, zaehler8,
zaehler9, zaehler10, zaehler11,
hilfcardinal, farbfeld :cardinal;
phi, farbfeldxreal, farbfeldyreal,
hilffloat :real;
farbfeldx, farbfeldy :integer;
(*****************************************************************)
(*** ***)
(*** Unter - Prozedur Farbfeldzuweisen ***)
(*** angle phi ( von 0-360 ) ***)
(*** will be set a value from 0 - 35 ***)
(*** ***)
(*****************************************************************)
procedure farbfeldzuweisen(vector phi : cardinal) : vector cardinal;
vector hilf1,hilf2 : cardinal;
begin
hilf1 := phi mod 10;
hilf2 := phi div 10;
if hilf1>6 then inc(hilf2);end;
if hilf2 = 36 then hilf2 := 0;end;
return(hilf2);
end farbfeldzuweisen;
begin
zaehler0 := 0;
zaehler1 := 0;
zaehler2 := 0;
zaehler3 := 0;
zaehler4 := 0;
zaehler5 := 0;
zaehler6 := 0;
zaehler7 := 0;
zaehler8 := 0;
zaehler9 := 0;
zaehler10 := 0;
zaehler11 := 0;
farbfeldx := 0;
farbfeldy := 0;
uebergabeteilchenrot := anzahlrotblau[zaehlerff];
for durchlauf := 1 to 6 do
case durchlauf of
1 : propagate.rechts(uebergabeteilchenrot,zaehler6);|
2 : propagate.links(uebergabeteilchenrot,zaehler0);|
3 : propagate.oben_links(uebergabeteilchenrot,zaehler10);|
4 : propagate.unten_links(uebergabeteilchenrot,zaehler2);|
5 : propagate.oben_rechts(uebergabeteilchenrot,zaehler8);|
6 : propagate.unten_rechts(uebergabeteilchenrot,zaehler4);
end;
end; (* for *)
(* dekodieren *)
hilfcardinal := zaehler0;
zaehler0 := hilfcardinal div offset6;
zaehler1 := hilfcardinal - zaehler0 * offset6;
hilfcardinal := zaehler2;
zaehler2 := hilfcardinal div offset6;
zaehler3 := hilfcardinal - zaehler2 * offset6;
hilfcardinal := zaehler4;
zaehler4 := hilfcardinal div offset6;
zaehler5 := hilfcardinal - zaehler4 * offset6;
hilfcardinal := zaehler6;
zaehler6 := hilfcardinal div offset6;
zaehler7 := hilfcardinal - zaehler6 * offset6;
hilfcardinal := zaehler8;
zaehler8 := hilfcardinal div offset6;
zaehler9 := hilfcardinal - zaehler8 * offset6;
hilfcardinal := zaehler10;
zaehler10 := hilfcardinal div offset6;
zaehler11 := hilfcardinal - zaehler10 * offset6;
farbfeldx := zaehler0 + zaehler0 + zaehler2 - zaehler4 - zaehler6 - zaehler6 -
zaehler8 + zaehler10;
farbfeldy := zaehler2 + zaehler2 + zaehler4 + zaehler4 -
zaehler8 - zaehler8 - zaehler10 - zaehler10;
farbfeldx := farbfeldx - zaehler1 - zaehler1 - zaehler3 + zaehler5 +
zaehler7 + zaehler7 + zaehler9 - zaehler11;
farbfeldy := farbfeldy - zaehler3 - zaehler3 - zaehler5 - zaehler5 +
zaehler9 + zaehler9 + zaehler11 + zaehler11;
farbfeldxreal := float(farbfeldx) * 0.5;
farbfeldyreal := float(farbfeldy) * wurzel3durch4;
phi := 0.0;
if (farbfeldxreal > 0.00001) or (farbfeldxreal < -0.00001) then
phi := arctan2(farbfeldyreal,farbfeldxreal);end;
phi := (phi / PI) * 180.0;
if (farbfeldxreal < 0.00001) and (farbfeldxreal > -0.00001) then
if farbfeldyreal>0. then phi := 90. else phi := 270.;end;
end;
if phi< 0.0 then phi := phi + 360.0; end;
phicardinal := trunc(phi);
farbfeld := farbfeldzuweisen(phicardinal);
return(farbfeld);
end Farbfeld;
(****************************************************************************)
(*** ***)
(*** Funktion Impulsberechnung: ***)
(*** implements the velocity for each node ***)
(*** ***)
(****************************************************************************)
procedure Impulsberechnung (vector zaehler : cardinal) : Vector impulstyp;
vector impuls_x, impuls_y : integer;
hilf : impulstyp;
impulshilfe, impulshilfehalb : cardinal;
begin
impuls_x := 0;
impuls_y := 0;
impulshilfe := Rote_Blaue_Teilchen[zaehler];
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x + 2;
end; (* r1 besetzt *)
impulshilfe := impulshilfehalb div 2;
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x + 1;
impuls_y := impuls_y + 1;
end; (* r2 besetzt *)
impulshilfe := impulshilfehalb div 2;
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x - 1;
impuls_y := impuls_y + 1;
end; (* r3 besetzt *)
impulshilfe := impulshilfehalb div 2;
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x - 2;
end; (* r4 besetzt *)
impulshilfe := impulshilfehalb div 2;
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x - 1;
impuls_y := impuls_y - 1;
end; (* r5 besetzt *)
impulshilfe := impulshilfehalb div 2;
impulshilfehalb := impulshilfe div 2;
if odd(impulshilfe)
or odd(impulshilfehalb) then
impuls_x := impuls_x + 1;
impuls_y := impuls_y - 1;
end; (* r6 besetzt *)
hilf.impuls_x := impuls_x;
hilf.impuls_y := impuls_y;
return(hilf);
end Impulsberechnung;
(****************************************************************************)
(*** ***)
(*** Funktion AnzahlroteTeilchen ***)
(*** implements the number of red particels for each node ***)
(*** ***)
(****************************************************************************)
procedure AnzahlroteTeilchen (vector zaehlerr : cardinal) : vector cardinal;
vector shiftcard,
zaehlerrot1,
zaehlerrot2 : cardinal;
begin
shiftcard := Rote_Blaue_Teilchen[zaehlerr] div 2;
zaehlerrot1 := 0;
for zaehlerrot2 := 0 to 7 do
if odd(shiftcard) then
inc(zaehlerrot1);
end;
shiftcard := shiftcard div 4;
end;
return(zaehlerrot1);
end AnzahlroteTeilchen;
(****************************************************************************)
(*** ***)
(*** Funktion AnzahlblaueTeilchen ***)
(*** implements the number of blue particels for each node ***)
(*** ***)
(****************************************************************************)
procedure AnzahlblaueTeilchen (vector zaehlerb : cardinal) : vector cardinal;
vector shiftcard, zaehlerblau1, zaehlerblau2 : cardinal;
begin
shiftcard := Rote_Blaue_Teilchen[zaehlerb];
zaehlerblau1 := 0;
for zaehlerblau2 := 0 to 7 do
if odd(shiftcard) then
inc(zaehlerblau1);
end;
shiftcard := shiftcard div 4;
end;
return(zaehlerblau1);
end AnzahlblaueTeilchen;
(****************************************************************************)
(*** ***)
(*** Prozedur RotateFarbfeld ***)
(*** rotate the colour field in an area from 0-4 ***)
(*** ***)
(****************************************************************************)
procedure Rotatefarbfeld (vector var farbfeldalt,farbfeldneu,zaehlerrot : cardinal);
(********************************************************************)
(*** ***)
(*** Hilfsprozedur trans ***)
(*** transforms each cell to a new state ***)
(*** ***)
(********************************************************************)
procedure trans();
const r0b0ueber = 4096; r0b0aus = 4095;
b1ueber = 1024; r1ueber = 2048;
r0b0orig = 12288; b0ueber = 4096;
r0ueber = 8192; zweihoch12= 2**12;
vector uebergabeteilchen, hilf :cardinal;
begin
(* Prinzip : r0,b0 bleibt erhalten; *)
(* r6 - b2 werden nach rechts geshiftet *)
(* r1,b1 wird zu r6,b6 *)
uebergabeteilchen := Rote_Blaue_Teilchen[zaehlerrot];
hilf := Rote_Blaue_Teilchen[zaehlerrot] div zweihoch12;
hilf := hilf * zweihoch12;
(* r0,b0 ausblenden *)
uebergabeteilchen := uebergabeteilchen - hilf;
(* 2 nach rechts shiften *)
uebergabeteilchen := uebergabeteilchen div 4;
(* war r1 oder b1 gesetzt ? *)
if odd(Rote_Blaue_Teilchen[zaehlerrot]) then
uebergabeteilchen:=uebergabeteilchen+b1ueber;
else
if odd(Rote_Blaue_Teilchen[zaehlerrot] div 2) then
uebergabeteilchen:=uebergabeteilchen+r1ueber;end;
end;
(* war r0 oder b0 gesetzt ? *)
if hilf = b0ueber then
uebergabeteilchen:=uebergabeteilchen+b0ueber;
else
if hilf = r0ueber then
uebergabeteilchen:=uebergabeteilchen+r0ueber;end;
end;
Rote_Blaue_Teilchen[zaehlerrot] := uebergabeteilchen;
end trans;
begin
farbfeldneu := farbfeldalt;
while(farbfeldneu>5) do
farbfeldneu := farbfeldneu - 6;
trans;
end;
end Rotatefarbfeld;
(****************************************************************************)
(*** ***)
(*** Prozedur ReRotateFarbfeld ***)
(*** rerotate colour field in the area 0-4 ***)
(*** ***)
(****************************************************************************)
procedure ReRotatefarbfeld (vector var farbfeldalt,farbfeldneu,zaehlerrerot : cardinal);
(********************************************************************)
(*** ***)
(*** Hilfsprozedur retrans ***)
(*** transforms each cell back to its old state ***)
(*** ***)
(********************************************************************)
procedure retrans();
const r0b0ueber = 4096; r0b0r6b6aus = 1023;
b1ueber = 1024; r1ueber = 2048;
r0b0orig = 12288; b0ueber = 4096;
r0ueber = 8192; zweihoch10 = 2**10;
vector uebergabeteilchen, hilf1, hilf :cardinal;
begin
(* Prinzip : r0,b0 bleibt erhalten; *)
(* r6 - b2 werden nach links geshiftet *)
(* r6,b6 wird zu r1,b1 *)
uebergabeteilchen := Rote_Blaue_Teilchen[zaehlerrerot];
(* r0,b0,r6,b6 ausblenden *)
hilf := uebergabeteilchen div zweihoch10;
hilf1 := hilf * zweihoch10;
uebergabeteilchen := uebergabeteilchen - hilf1;
(* 2 nach rechts shiften *)
uebergabeteilchen := uebergabeteilchen * 4;
(* war r6 oder b6 gesetzt ? *)
(* b6 gesetzt *)
if odd(hilf) then uebergabeteilchen:=uebergabeteilchen+1;end;
(* r6 gesetzt *)
hilf := hilf div 2;
if odd(hilf) then uebergabeteilchen:=uebergabeteilchen+2;end;
(* war r0 oder b0 gesetzt ? *)
hilf := hilf div 2;
(* b0 gesetzt *)
if odd(hilf) then uebergabeteilchen:=uebergabeteilchen+b0ueber;end;
(* r0 gesetzt *)
hilf := hilf div 2;
if odd(hilf) then uebergabeteilchen:=uebergabeteilchen+r0ueber;end;
Rote_Blaue_Teilchen[zaehlerrerot] := uebergabeteilchen;
end retrans;
begin
while(farbfeldneu<>farbfeldalt) do
farbfeldneu := farbfeldneu + 6;
retrans;
end;
end ReRotatefarbfeld;
(****************************************************************************)
(*** ***)
(*** Prozedur Impulstabelleeinlesen ***)
(*** loads the table for velocity ***)
(*** ***)
(****************************************************************************)
procedure Impulstabeinlesen();
scalar impulsfeld : impulsfeldtyp;
fileint1, fileint2, fileint3,
zaehler1, zaehler2 : integer;
begin
(* Initialisieren *)
for zaehler1:=-4 to 4 do
for zaehler2:=-2 to 2 do
impulsfeld[zaehler1][zaehler2] :=0 ;
end;
end;
openinput(Impulstabelle);
if not(DONE) then errorhandle(2);end;
for zaehler1:=1 to 19 do
readint(fileint1);
readint(fileint2);
readint(fileint3);
impulsfeld[fileint1][fileint2] := fileint3;
end;
closeinput;
parallel
for zaehler1:=-4 to 4 do
for zaehler2:=-2 to 2 do
impulsfeldall[zaehler1][zaehler2] := impulsfeld[zaehler1][zaehler2] ;
end;
end;
endparallel;
end Impulstabeinlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Teilchentabelleeinlesen ***)
(*** loads the table for the particels ***)
(*** ***)
(****************************************************************************)
procedure Teilcheneinlesen();
scalar teilchenfeld : teilchenfeldtyp;
(* rote T. , Blaue T. , Nummer *)
fileint1, fileint2, fileint3,
zaehler1, zaehler2 : integer;
begin
(* Initialisieren *)
for zaehler1:=0 to 7 do
for zaehler2:=0 to 7 do
teilchenfeld[zaehler1][zaehler2] :=0 ;
end;
end;
openinput(Teilchentabelle);
if not(DONE) then errorhandle(2);end;
for zaehler1:=1 to 36 do
readint(fileint1);
readint(fileint2);
readint(fileint3);
teilchenfeld[fileint1][fileint2] := fileint3;
end;
closeinput;
parallel
for zaehler1:=0 to 7 do
for zaehler2:=0 to 7 do
teilchenfeldall[zaehler1][zaehler2] := teilchenfeld[zaehler1][zaehler2] ;
end;
end;
endparallel;
end Teilcheneinlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Zuordungstabellelesen ***)
(*** loads the table for getting a state ***)
(*** ***)
(****************************************************************************)
procedure Zuordeinlesen();
scalar teilimpfeld : teilimptyp;
(* Teilchen , Impuls , Nummer *)
fileint1, fileint2, fileint3,
zaehler1, zaehler2, zaehler3 : cardinal;
sizei: integer;
begin
(* Initialisieren *)
for zaehler1:=1 to 19 do
for zaehler2:=1 to 36 do
teilimpfeld[zaehler1][zaehler2] :=0 ;
end;
end;
openinput(Zuordtabelle);
if not(DONE) then errorhandle(2);end;
for zaehler3 := 1 to 360 do
readcard(fileint1);
readcard(fileint2);
readcard(fileint3);
teilimpfeld[fileint1][fileint2] := fileint3;
end;
closeinput;
parallel
for zaehler1:= 1 to 19 do
for zaehler2 := 1 to 36 do
teilimpfeldall[zaehler1][zaehler2] := teilimpfeld[zaehler1][zaehler2];
end;
end;
endparallel;
end Zuordeinlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Schnappschuss ***)
(*** snapshots the current state in a specified file ***)
(*** ***)
(****************************************************************************)
procedure schnappschuss(scalar string : string80);
vector zaehler1, zaehler2,
offsetv : cardinal;
begin
openoutput(filestring);
if not(DONE) then errorhandle(1);end;
parallel
offsetv := 0;
for zaehler1 := 1 to vfakty do
for zaehler2 := 1 to vfaktx do
writecard(Rote_Blaue_Teilchen[zaehler2+offsetv],6);
end;
offsetv := offsetv + vfaktx;
end;
endparallel;
closeoutput;
end schnappschuss;
(****************************************************************************)
(*** ***)
(*** Prozedur Schnappschussgeord ***)
(*** another way to snapshot for each stae in descending order ***)
(*** much slower than the other way above ***)
(*** ***)
(****************************************************************************)
procedure schnappschussgeord(scalar string : string80);
vector zaehler1, zaehler2, zaehler3,
offsetv : cardinal;
begin
openoutput(filestring);
if not(DONE) then errorhandle(1);end;
parallel
offsetv := 0;
for zaehler1 := 1 to vfakty do
for zaehler3 := 0 to maxnet-1 do
for zaehler2 := 1 to vfaktx do
if ((maxnet-1)-DIM1)= zaehler3 then
writecard(Rote_Blaue_Teilchen[zaehler2+offsetv],6);
end;
end;
end;
offsetv := offsetv + vfaktx;
end;
endparallel;
closeoutput;
end schnappschussgeord;
(****************************************************************************)
(*** ***)
(*** Prozedur Aufsetzer_einlesen ***)
(*** loads a snapshot ***)
(*** ***)
(****************************************************************************)
procedure aufsetzer_einlesen();
scalar zaehlera,zaehlerb,zaehlerc,teils (**) : cardinal;
wodatei : string80;
getan : boolean;
feld : array[0..127],[0..127] of cardinal;
vector teil :cardinal;
begin
openinput(aufsetzerfile);
if not(DONE) then errorhandle(2);end;
readstring(wodatei);
closeinput;
openinput(wodatei);
if not(DONE) then errorhandle(2);end;
writestring(wodatei);
writeln;
(* parallel
zaehlera := 1;
getan := true;
while getan do
writecard(zaehlera,5);
ReadCard(teil);
getan := DONE;
Rote_Blaue_Teilchen[zaehlera] := teil;
inc(zaehlera);
end;
endparallel;
writeln;*)
for zaehlerc := 1 to 4 do
writecard(zaehlerc,5);
writeln;
for zaehlera := 0 to 127 do
for zaehlerb := 0 to 127 do
Readcard(teils);
feld[zaehlera][zaehlerb] := teils;
end;
end;
parallel
load(Rote_Blaue_Teilchen[zaehlerc],feld);
endparallel;
end;
closeinput;
end aufsetzer_einlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Aufsetzer_einlesengeordnet ***)
(*** loads a snapshot in descending order (see above) ***)
(*** ***)
(****************************************************************************)
procedure aufsetzer_einlesen_geordnet();
scalar zaehler1, zaehler2, virtpesx,
virtpesy : cardinal;
begin
openinput(aufsetzerfile);
if not(DONE) then errorhandle(2);end;
readcard(virtpesx);
readcard(virtpesy);
parallel
for zaehler1 := 1 to virtpesy div maxnet do
for zaehler2 := 1 to virtpesx div maxnet do
readcard(Rote_Blaue_Teilchen[zaehler1+(zaehler2-1)*(virtpesx div maxnet)]);
end;
end;
endparallel;
closeinput;
end aufsetzer_einlesen_geordnet;
(****************************************************************************)
(*** ***)
(*** Prozedur ausgabe_rot_blau ***)
(*** produces SUN-Rasterfiles with one colour for each state ***)
(*** ***)
(****************************************************************************)
procedure ausgabe_rot_blau(scalar string : string80);
scalar filehilf1, filehilf2,
filehilf3 : cardinal;
vector rotblau,
hilfrotblau : rotblauteilchentyp;
durchlauf, roteT, blaueT, hilfsvar,
hilf1, hilf2, hilf3,
hilf4, maxhilf, zeilenfaktor : cardinal;
procedure belegerotblau(vector teil,stelle1:cardinal);
begin
if teil=0 then rotblau[stelle1]:=0
else rotblau[stelle1]:=1; end;
end belegerotblau;
begin
writestring('Datei :');
writestring(filestring);
writestring(' geschrieben');
writeln;
openoutput(filestring);
if not(DONE) then errorhandle(1);end;
write(chr(89));
write(chr(166));
write(chr(106));
write(chr(149));
write(chr(0)); (* Laenge *)
write(chr(0));
filehilf1 := virtuellepesy div 256;
write(chr(filehilf1));
filehilf2 := virtuellepesy - filehilf1 * 256;
write(chr(filehilf2));
write(chr(0)); (* Breite *)
write(chr(0));
filehilf1 := virtuellepesx div 256;
write(chr(filehilf1));
filehilf2 := virtuellepesx - filehilf1 * 256;
write(chr(filehilf2));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(1));
write(chr(0)); (* Laenge * Breite *)
filehilf1 := (virtuellepesx * virtuellepesy);(*vorher **2*)
filehilf2 := filehilf1 div 256**2;
write(chr(filehilf2));
filehilf1 := filehilf1 - filehilf2 * 256**2;
filehilf2 := filehilf1 div 256;
write(chr(filehilf2));
filehilf1 := filehilf1 - filehilf2 * 256;
write(chr(filehilf1));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(1));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(0));
write(chr(0));
parallel
(* Initialisierung *)
for hilf1 := 1 to vfakt do
rotblau[hilf1] := 0;
hilfrotblau[hilf1] := 0;
end; (* for *)
for hilf1 :=1 to vfakt do
roteT := anzahlrotblau[hilf1] div offset6;
blaueT := anzahlrotblau[hilf1] - roteT * offset6;
if roteT > blaueT then belegerotblau(0,hilf1);
else belegerotblau(1,hilf1); end;
end; (* for *)
for durchlauf := 0 to 6 do
if dim2 mod 8 = durchlauf then
for hilf1 := 1 to vfakt do
rotblau[hilf1] := rotblau[hilf1] * 2;
end;
end;
(*if (dim2 mod 8 = durchlauf) or (dim2 mod 8 = (durchlauf + 1)) then*)
for hilf1 := 1 to vfakt do
propagate.rechts(rotblau[hilf1],hilfsvar);
hilfrotblau[hilf1] := hilfsvar;
end;
(*end;*)
if dim2 mod 8 = (durchlauf + 1) then
for hilf1 := 1 to vfakt do
rotblau[hilf1] := rotblau[hilf1] + hilfrotblau[hilf1];
end;
end;
end; (* for *)
zeilenfaktor := 0;
maxhilf := maxnet-1;
for hilf1 := 1 to vfakty do
for hilf2 := 0 to maxhilf do
for hilf3 := 1 to vfaktx do
if ((maxhilf - DIM1) = hilf2) then
hilf4 := hilf3 + zeilenfaktor;
if (dim2 mod 8 = 7) then write(chr(rotblau[hilf4]));end;
end;(* if *)
end; (* for hilf3 *)
end; (* for hilf2 *)
zeilenfaktor := zeilenfaktor + vfaktx;
end; (* for hilf1 *)
endparallel;
closeoutput;
if not(DONE) then errorhandle(3);end;
end ausgabe_rot_blau;
(****************************************************************************)
(*** ***)
(*** Prozedur Kollisionstabelle ***)
(*** loads the collision table ***)
(*** ***)
(****************************************************************************)
procedure Koltabeinlesen();
scalar kolfeld : kolfeldtyp;
(* farbfeld , Zustandsnummer -> #Gleiche ,Ausgangsposition *)
(* Bit 1-4 ,Bit 5-16 *)
fileint1, fileint2, fileint3,
fileint4, zaehler1, zaehler2,
durchlauf : cardinal;
kolfeldtemp : array[1..360] of cardinal;
begin
(* Initialisieren *)
for zaehler1:=0 to 3 do
for zaehler2:=1 to 180 do
kolfeld[zaehler1][zaehler2] :=0 ;
end;
end;
for zaehler2:=1 to 180 do
kolfeldtemp[zaehler2] :=0 ;
end;
for durchlauf := 0 to 3 do
case durchlauf of
0 : openinput(Kollisionstabelle1);|
1 : openinput(Kollisionstabelle2);|
2 : openinput(Kollisionstabelle3);|
3 : openinput(Kollisionstabelle4);
end;
if not(DONE) then errorhandle(2);end;
(* in der Tabelle Kolfeld werden die Anzahl gleicher Zustaende in *)
(* codierter Form gespeichert. *)
(* 'High-Bytes' : Position in der Kollisionstab *)
(* 'Low-Bytes ' : #gleicher Zustaende *)
for zaehler1:=1 to 360 do
readint(fileint1);
readint(fileint2);
readint(fileint3);
readint(fileint4);
(* Da Farbfeld 2 identisch mit Farbfeld 1 ist, muss ab Ff. 3 *)
(* eine Abbildung erfolgen, um nicht eine ganze Spalte der *)
(* Matrix freilassen zu muessen ! *)
(* Abbildung : Farbfeld 0 -> Nummer 0 *)
(* Farbfeld 1 -> Nummer 1 *)
(* Farbfeld 2 -> Nummer 1 *)
(* Farbfeld 3 -> Nummer 2 *)
(* Farbfeld 4 -> Nummer 3 *)
(* Ff. 2 existiert dabei nicht als Datei !! *)
if fileint1>2 then fileint1 := fileint1 - 1; end;
(* High-Byte codieren *)
fileint3 := fileint3 * offset4;
fileint3 := fileint3 + fileint4;
kolfeldtemp[fileint2] := fileint3;
end; (* for *)
for zaehler1 := 1 to 180 do
kolfeld[fileint1][zaehler1] := kolfeldtemp[zaehler1*2-1] * offset15 + kolfeldtemp[zaehler1*2];
end;
closeinput;
end; (* for *)
parallel
for zaehler1 := 0 to 3 do
for zaehler2 := 1 to 180 do
kolfeldall[zaehler1][zaehler2] := kolfeld[zaehler1][zaehler2];
end;
end;
endparallel;
end Koltabeinlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Kollisionstabelle ***)
(*** loads the collision table ***)
(*** ***)
(****************************************************************************)
procedure kollisionstab();
scalar zustandstab : zustandstyp;
(* 1788 Zustaende codiert *)
temptab : array[0 .. (file1l+file2l+file3l+file4l)+1] of cardinal;
filecard1, position, position2,
filezaehler, durchlauf, hilf,
maxpos, schleifezaehler : cardinal;
vorsicht : boolean;
begin
(* Initialisierung *)
vorsicht := false;
maxpos := file1l+file2l+file3l+file4l;
if odd(maxpos) then maxpos := (maxpos div 2)+1;
else maxpos := maxpos div 2; end;
for position := 0 to maxpos do
zustandstab[position] := 0;
end; (* for *)
for position := 0 to (file1l+file2l+file3l+file4l)+1 do
temptab[position] := 0;
end; (* for *)
position :=0;
for durchlauf := 0 to 3 do
case durchlauf of
0 : openinput(file1);
filezaehler:= file1l; |
1 : openinput(file2);
filezaehler:= file2l; |
2 : openinput(file3);
filezaehler:= file3l; |
3 : openinput(file4);
filezaehler:= file4l;
end;
if not(DONE) then errorhandle(2);end;
for schleifezaehler := 1 to filezaehler do
readcard(filecard1);
temptab[position] := filecard1;
inc(position);
end;
closeinput;
end; (* for *)
position := 0;
position2:= 0;
if odd(maxpos) then vorsicht :=true; end;
while position2 < maxpos do
zustandstab[position2] := (temptab[position] * offset15) + temptab[(position+1)];
position := position + 2;
inc(position2);
if position= maxpos-1 then
if vorsicht then
zustandstab[position2]:=temptab[position]* offset15;
position:=position + 1;
end;
end;
end;
parallel
for schleifezaehler:=0 to 894 do
zustandstaball[schleifezaehler] := zustandstab[schleifezaehler];
end;
endparallel;
end kollisionstab;
(****************************************************************************)
(*** ***)
(*** Prozedur Einlesen: ***)
(*** for loading all tables and sending it to each PE`s ***)
(*** ***)
(****************************************************************************)
procedure einlesen();
begin
Impulstabeinlesen;
Teilcheneinlesen;
Zuordeinlesen;
Koltabeinlesen;
kollisionstab;
end einlesen;
(****************************************************************************)
(*** ***)
(*** Prozedur Randbehandlung ***)
(*** collision on the processwing elements on each side ***)
(*** ***)
(****************************************************************************)
procedure Randbehandlung(scalar string:stringtyp; vector zaehler:integer);
const zweihoch2 = 2**2; zweihoch3 = 2**3; zweihoch4 = 2**4;
zweihoch5 = 2**5; zweihoch6 = 2**6; zweihoch7 = 2**7;
zweihoch8 = 2**8; zweihoch9 = 2**9; zweihoch10= 2**10;
zweihoch11= 2**11;
vector hilf : cardinal;
procedure drehen(vector zaehler, woher, wohin : cardinal);
begin
Rote_Blaue_Teilchen[zaehler] := Rote_Blaue_Teilchen[zaehler] - woher;
Rote_Blaue_Teilchen[zaehler] := Rote_Blaue_Teilchen[zaehler] + wohin;
end drehen;
begin
if string='unten' then
if randunten='free_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch8;
if odd(hilf) then
drehen(zaehler,zweihoch8,zweihoch4);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch9,zweihoch5);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch10,zweihoch2);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch11,zweihoch3);
end;
else if randunten='no_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch8;
if odd(hilf) then
drehen(zaehler,zweihoch8,zweihoch2);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch9,zweihoch3);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch10,zweihoch4);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch11,zweihoch5);
end;
end;
end;
end;
if string='oben' then
if randoben='free_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch2;
if odd(hilf) then
drehen(zaehler,zweihoch2,zweihoch10);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch3,zweihoch11);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch4,zweihoch7);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch5,zweihoch8);
end;
else if randoben='no_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch2;
if odd(hilf) then
drehen(zaehler,zweihoch2,zweihoch8);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch3,zweihoch9);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch4,zweihoch10);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch5,zweihoch11);
end;
end;
end;
end;
if string='linksw' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch4;
if odd(hilf) then
drehen(zaehler,zweihoch4,zweihoch2);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch5,zweihoch3);
end;
end;
if string='links' then
if randlinks='free_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch4;
if odd(hilf) then
drehen(zaehler,zweihoch4,zweihoch2);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch5,zweihoch3);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch6,1);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch7,2);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch8,zweihoch10);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch9,zweihoch11);
end;
else if randlinks='no_slip' then
hilf := Rote_Blaue_Teilchen[zaehler] div zweihoch4;
if odd(hilf) then
drehen(zaehler,zweihoch4,zweihoch10);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch5,zweihoch11);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch6,1);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch7,2);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch8,zweihoch2);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch9,zweihoch3);
end;
end;
end;
end;
if string='rechtsw' then
hilf := Rote_Blaue_Teilchen[zaehler];
if odd(hilf) then
drehen(zaehler,1,zweihoch6);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,2,zweihoch7);
end;
end;
if string='rechts' then
if randrechts='free_slip' then
hilf := Rote_Blaue_Teilchen[zaehler];
if odd(hilf) then
drehen(zaehler,1,zweihoch6);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,2,zweihoch7);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch2,zweihoch4);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch3,zweihoch5);
end;
hilf:= hilf div zweihoch7;
if odd(hilf) then
drehen(zaehler,zweihoch10,zweihoch8);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch11,zweihoch9);
end;
else if randrechts='no_slip' then
hilf := Rote_Blaue_Teilchen[zaehler];
if odd(hilf) then
drehen(zaehler,1,zweihoch6);
end;
hilf := hilf div 2;
if odd(hilf) then
drehen(zaehler,2,zweihoch7);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch2,zweihoch8);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch3,zweihoch9);
end;
hilf:= hilf div zweihoch7;
if odd(hilf) then
drehen(zaehler,zweihoch10,zweihoch4);
end;
hilf:= hilf div 2;
if odd(hilf) then
drehen(zaehler,zweihoch11,zweihoch5);
end;
end;
end;
end;
end Randbehandlung;
(****************************************************************************)
(*** ***)
(*** Prozedur Kollision: ***)
(*** produces a new state using colour field and old state ***)
(*** ***)
(****************************************************************************)
procedure kollision(scalar randoben,randunten,randlinks,randrechts : string10);
vector impuls : impulstyp;
impuls_x, impuls_y, zufall : integer;
richtung, richtungneu,
roteT, blaueT,
teilchennummer, impulsnummer,
teilimpnummer, teilimphilf,
kolfeldnummer, positionhilf,
ausgangszustand, endpos,
ausgangsposition, gleiche,
ausganghilf, zaehler : cardinal;
listenposition : integer;
wo : stringtyp;
randbereich : boolean;
begin
parallel
randbereich := false;
for zaehler := 1 to vfakt do
if not(streq(randunten,"'RING'")) and (DIM1 = 0) and (vfakt-vfaktx <= zaehler) then
Randbehandlung('unten',zaehler);
randbereich := true;
end;
if not(streq(randoben,"'RING'")) and (DIM1 = maxnet-1) and (zaehler <= vfaktx) then
Randbehandlung('oben',zaehler);
randbereich := true;
end;
if not(streq(randlinks,"'RING'")) and (DIM2 = 0) and (zaehler mod vfaktx = 1) then
if (DIM1 mod 2 = 0) then
Randbehandlung('links',zaehler);
randbereich := true;
else Randbehandlung('linksw',zaehler);
randbereich := true;
end;
end;
if not(streq(randrechts,"'RING'")) and (DIM2 = maxnet-1) and (zaehler mod vfaktx = 0) then
if (DIM1 mod 2 = 1) then
Randbehandlung('rechts',zaehler);
randbereich := true;
else Randbehandlung('rechtsw',zaehler);
randbereich := true;
end;
end;
if not(randbereich) then
(* Farbfeld berechnen *)
(*writestring('Farbfeld berechnen');*)
(*writeln;*)
richtung:=Farbfeld(zaehler);
(*writestring('Farbfeld berechnen Ende');*)
(*writeln;*)
(*Farbfeld in gewuenschte Position drehen *)
(*writestring('Rotieren');*)
(*writeln;*)
RotateFarbfeld(richtung,richtungneu,zaehler);
(*writestring('Rotieren Ende');*)
(*writeln;*)
(* Impuls berechnen *)
impuls:= Impulsberechnung(zaehler);
impuls_x:=impuls.impuls_x;
impuls_y:=impuls.impuls_y;
(* rote und blaue Teilchen *)
roteT := anzahlrotblau[zaehler] div offset6;
blaueT := anzahlrotblau[zaehler] - roteT * offset6;
(* Teilchenzuordnung *)
teilchennummer := teilchenfeldall[blaueT][roteT];
(* Impulsfeldzuordnung *)
impulsnummer := impulsfeldall[impuls_x][impuls_y];
(* Nummer Zustand zuordnen *)
teilimpnummer := teilimpfeldall[impulsnummer][teilchennummer];
(* Position in der Kollisionstabelle bestimmen *)
positionhilf := richtungneu;
if richtungneu=5 then positionhilf:=3;
else
if richtungneu>1 then
positionhilf:= richtungneu-1;
end;
end;
teilimphilf := teilimpnummer div 2;
if odd(teilimpnummer) then inc(teilimphilf);end;
kolfeldnummer := kolfeldall[positionhilf][teilimphilf];
(* kolfeldnummer decodieren *)
if odd(teilimpnummer) then
kolfeldnummer := kolfeldnummer div offset15;
else
ausganghilf := kolfeldnummer div offset15;
kolfeldnummer := kolfeldnummer - (ausganghilf * offset15);
end;
ausgangsposition := kolfeldnummer div offset4;
gleiche := kolfeldnummer - (ausgangsposition * offset4);
if ausgangsposition > 0 then
zufall := 0;
if gleiche > 1 then
zufall := virandom();
zufall := zufall mod gleiche;
end;
endpos := ausgangsposition + zufall;
listenposition := endpos div 2;
if even(endpos) then dec(listenposition);end;
ausgangszustand:= zustandstaball[listenposition];
ausganghilf := ausgangszustand div offset15;
if even(endpos) then
ausganghilf:= ausgangszustand - ausganghilf * offset15;
end;
Rote_Blaue_Teilchen[zaehler] := ausganghilf;
end;
(* Zustand wieder in Originalzustand zurueckdrehen *)
ReRotateFarbfeld(richtung,richtungneu,zaehler);
end; (* if *)
end; (*for*)
endparallel;
end kollision;
(****************************************************************************)
(*** ***)
(*** Prozedur filefind ***)
(*** find a new name for output files ***)
(*** ***)
(****************************************************************************)
procedure filefind ( scalar var string : string80; scalar welches : integer);
scalar findestelle : cardinal;
begin
if welches = 0 then
filestring := schnappschussausgabe;
filezaehlerhilf := filezaehlers;
findestelle := 1;
while (findestelle < 80) and
((ord(filestring[findestelle]) < 48) or (ord(filestring[findestelle]) > 58)) do
inc(findestelle);
end;
filestring[findestelle] := chr(filezaehlers div 1000 +48);
filezaehlers := filezaehlers - (filezaehlers div 1000 * 1000);
filestring[findestelle+1] := chr(filezaehlers div 100 +48);
filezaehlers := filezaehlers - (filezaehlers div 100 * 100);
filestring[findestelle+2] := chr(filezaehlers div 10 +48);
filezaehlers := filezaehlers - (filezaehlers div 10 * 10);
filestring[findestelle+3] := chr(filezaehlers +48);
filezaehlers := filezaehlerhilf;
inc(filezaehlers);
end;
if welches = 1 then
filestring := rotblauausgabe;
filezaehlerhilf := filezaehlerrb;
findestelle := 1;
while (findestelle < 80) and
((ord(filestring[findestelle]) < 48) or (ord(filestring[findestelle]) > 58)) do
inc(findestelle);
end;
filestring[findestelle] := chr(filezaehlerrb div 1000 +48);
filezaehlerrb := filezaehlerrb - (filezaehlerrb div 1000 * 1000);
filestring[findestelle+1] := chr(filezaehlerrb div 100 +48);
filezaehlerrb := filezaehlerrb - (filezaehlerrb div 100 * 100);
filestring[findestelle+2] := chr(filezaehlerrb div 10 +48);
filezaehlerrb := filezaehlerrb - (filezaehlerrb div 10 * 10);
filestring[findestelle+3] := chr(filezaehlerrb +48);
filezaehlerrb := filezaehlerhilf;
inc(filezaehlerrb);
end;
if welches = 2 then
filestring := vektorausgabe;
filezaehlerhilf := filezaehlerv;
findestelle := 1;
while (findestelle < 80) and
((ord(filestring[findestelle]) < 48) or (ord(filestring[findestelle]) > 58)) do
inc(findestelle);
end;
filestring[findestelle] := chr(filezaehlerv div 1000 +48);
filezaehlerv := filezaehlerv - (filezaehlerv div 1000 * 1000);
filestring[findestelle+1] := chr(filezaehlerv div 100 +48);
filezaehlerv := filezaehlerv - (filezaehlerv div 100 * 100);
filestring[findestelle+2] := chr(filezaehlerv div 10 +48);
filezaehlerv := filezaehlerv - (filezaehlerv div 10 * 10);
filestring[findestelle+3] := chr(filezaehlerv +48);
filezaehlerv := filezaehlerhilf;
inc(filezaehlerv);
end;
end filefind;
(****************************************************************************)
procedure anzahl_rotblau;
vector summerot,summeblau,rbzaehler: cardinal;
begin
parallel
(* Initialisierung *)
for rbzaehler := 1 to vfakt do
anzahlrotblau[rbzaehler] := 0;
end;
for rbzaehler := 1 to vfakt do
summerot := AnzahlroteTeilchen(rbzaehler);
summeblau := AnzahlblaueTeilchen(rbzaehler);
anzahlrotblau[rbzaehler] := summerot * offset6 + summeblau;
end;
endparallel;
end anzahl_rotblau;
(****************************************************************************)
procedure dichte(scalar zaehlerd: cardinal);
vector rot,blau : cardinal;
dichterot,dichteblau : real;
begin
parallel
rot := anzahlrotblau[zaehlerd] div offset6;
blau := anzahlrotblau[zaehlerd] - rot * offset6;
dichterot := float(rot)/7.;
dichteblau:= float(blau)/7.;
(* irgendwie ausgeben *)
endparallel;
end dichte;
(****************************************************************************)
procedure geschwindigkeit(scalar string : string80;
scalar anzahlgemitteltx,anzahlgemittelty : cardinal);
vector hilfteil, hilfteilhalb,
xrichtung, yrichtung,
anzahlteile, rot,
blau, teilchenzaehler : cardinal;
hilfsgeschwindigkeitx, hilfsgeschwindigkeity,
uebergabegeschwindigkeitx, uebergabegeschwindigkeity,
geschwx, geschwy :real;
vektorenxy : array[1..vfakt] of vectortyp;
scalar zaehlerg, hilf5, hilf1,
hilf2, hilf4, hilf3 ,
offset, index,
hilf6, zaehler :integer;
zeilex, ergebnisx, ergebnisy,
zeiley : array[0..maxnet-1] of real;
hilf7 : real;
begin
parallel
for zaehlerg := 1 to vfakt do
geschwx := 0.;
geschwy := 0.;
uebergabegeschwindigkeitx := 0.;
uebergabegeschwindigkeity := 0.;
hilfteil := Rote_Blaue_Teilchen[zaehlerg];
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx + 1.;end;
hilfteil := hilfteilhalb div 2;
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx + 0.5;
geschwy := geschwy + wurzeldreidurch2;end;
hilfteil := hilfteilhalb div 2;
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx - 0.5;
geschwy := geschwy + wurzeldreidurch2;end;
hilfteil := hilfteilhalb div 2;
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx - 1.;end;
hilfteil := hilfteilhalb div 2;
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx - 0.5;
geschwy := geschwy - wurzeldreidurch2;end;
hilfteil := hilfteilhalb div 2;
hilfteilhalb := hilfteil div 2;
if odd(hilfteil) or odd(hilfteilhalb) then
geschwx := geschwx + 0.5;
geschwy := geschwy - wurzeldreidurch2;end;
rot := anzahlrotblau[zaehlerg] div offset6;
blau := anzahlrotblau[zaehlerg] - rot * offset6;
anzahlteile := rot + blau;
if anzahlteile<>0 then
uebergabegeschwindigkeitx := geschwx / float(anzahlteile);
uebergabegeschwindigkeity := geschwy / float(anzahlteile);
else uebergabegeschwindigkeitx := 0.0;
uebergabegeschwindigkeity := 0.0;
end;
(* for xrichtung := 0 to anzahlgemitteltx-2 do
hilfsgeschwindigkeitx := 0.;
hilfsgeschwindigkeity := 0.;
propagate.rechts(uebergabegeschwindigkeitx,hilfsgeschwindigkeitx);
propagate.rechts(uebergabegeschwindigkeity,hilfsgeschwindigkeity);
if (dim2 mod anzahlgemitteltx) = xrichtung +1 then
uebergabegeschwindigkeitx := uebergabegeschwindigkeitx + hilfsgeschwindigkeitx;
uebergabegeschwindigkeity := uebergabegeschwindigkeity + hilfsgeschwindigkeity;
end;
end;
for yrichtung := 0 to anzahlgemittelty-2 do
hilfsgeschwindigkeitx := 0.;
hilfsgeschwindigkeity := 0.;
if yrichtung mod 2 = 0 then
if (((dim2 mod anzahlgemitteltx)= anzahlgemitteltx-1) and
((dim1 mod anzahlgemittelty)= anzahlgemittelty - 1 - yrichtung)) or
(((dim2 mod anzahlgemitteltx)= anzahlgemitteltx-1) and
((dim1 mod anzahlgemittelty)= anzahlgemittelty - 2 - yrichtung)) then
propagate.unten_rechts(uebergabegeschwindigkeitx,hilfsgeschwindigkeitx);
propagate.unten_rechts(uebergabegeschwindigkeity,hilfsgeschwindigkeity);
end;
end;
if yrichtung mod 2 = 1 then
if (((dim2 mod anzahlgemitteltx)= anzahlgemitteltx-1) and
((dim1 mod anzahlgemittelty)= anzahlgemittelty - 2 - yrichtung)) or
(((dim2 mod anzahlgemitteltx)= anzahlgemitteltx-1) and
((dim1 mod anzahlgemittelty)= anzahlgemittelty - 3 - yrichtung)) then
propagate.unten_links(uebergabegeschwindigkeitx,hilfsgeschwindigkeitx);
propagate.unten_links(uebergabegeschwindigkeity,hilfsgeschwindigkeity);
end;
end;
uebergabegeschwindigkeitx := uebergabegeschwindigkeitx + hilfsgeschwindigkeitx;
uebergabegeschwindigkeity := uebergabegeschwindigkeity + hilfsgeschwindigkeity;
end; *)
vektorenxy[zaehlerg].x_Richtung := uebergabegeschwindigkeitx;
vektorenxy[zaehlerg].y_Richtung := uebergabegeschwindigkeity;
end;
endparallel;
openoutput(string);
if not(DONE) then errorhandle(1);end;
write('V');
write('F');
write('F');
write('A');
hilf1 := virtuellepesx div anzahlgemitteltx;
writecard(hilf1,5);
hilf1 := virtuellepesy div anzahlgemittelty;
writecard(hilf1,5);
writecard(anzahlgemitteltx,5);
write(EOL);
(* parallel
for hilf2 := 0 to vfakty - 1 do
hilf4 := hilf2*vfaktx;
hilf1 := maxnet - anzahlgemittelty;
while hilf1>=0 do
if ((maxnet-1)- DIM1) = hilf1 then
(*if DIM2 mod anzahlgemitteltx = (anzahlgemitteltx-1) then*)
for zaehlerg := 1 to vfaktx do
hilf5 := hilf4 + zaehlerg;
hilf3 := anzahlgemitteltx-1;
while hilf3 < maxnet do
if (DIM2 = hilf3) then
writereal(vektorenxy[hilf5].x_Richtung,6);
writereal(vektorenxy[hilf5].y_Richtung,6);
end;
hilf3 := hilf3 + anzahlgemitteltx;
end;
end;
(* end;*)
end;
hilf1 := hilf1 - anzahlgemittelty;
end;
end;
endparallel; *)
for hilf1 := 1 to vfakty do
offset := (hilf1-1) * vfakty;
hilf2:=0;
while hilf2< maxnet do
for hilf3 := 1 to vfaktx do
zaehler := 0;
while zaehler < maxnet do
ergebnisx[zaehler] := 0.;
ergebnisy[zaehler] := 0.;
inc(zaehler);
end;
for hilf6 := 1 to anzahlgemittelty do
parallel
if (dim1 = (maxnet-hilf6-hilf2)) then
store(vektorenxy[hilf3+offset].x_Richtung, zeilex);
store(vektorenxy[hilf3+offset].y_Richtung, zeiley);
end;
endparallel;
hilf4:=1;
hilf5:= anzahlgemitteltx-1;
zaehler := hilf5 - hilf4;
while zaehler>0 do
while hilf5<maxnet do
zeilex[hilf5] := zeilex[hilf4]+zeilex[hilf5];
zeiley[hilf5] := zeiley[hilf4]+zeiley[hilf5];
hilf4:= hilf4 + anzahlgemitteltx;
hilf5:= hilf5 + anzahlgemitteltx;
end;
inc(hilf4);
hilf5:= anzahlgemitteltx-1;
zaehler := hilf5 - hilf4;
end;
zaehler:= anzahlgemitteltx-1;
while zaehler < maxnet do
ergebnisx[zaehler] := ergebnisx[zaehler] + zeilex[zaehler];
ergebnisy[zaehler] := ergebnisy[zaehler] + zeiley[zaehler];
zaehler:=zaehler+anzahlgemitteltx;
end;
end;
zaehler:= anzahlgemitteltx-1;
while zaehler < maxnet do
writereal(ergebnisx[zaehler] ,4);
writestring(' ');
writereal(ergebnisy[zaehler] ,4);
writeln;
zaehler:=zaehler+anzahlgemitteltx;
end;
end;
hilf2 := hilf2 + anzahlgemittelty;
end;
end;
closeoutput;
end geschwindigkeit;
(****************************************************************************)
procedure pruefe();
vector rot, blau, hilfz,
zaehler1 : cardinal;
feld : array [1..14] of cardinal;
hilfp : array [1..vfakt] of cardinal;
scalar rote, blaue, hilfs,
anzahl, zaehlerp : cardinal;
anzahlrb : array[1..14] of cardinal;
begin
rote := 0;
blaue := 0;
for zaehlerp := 1 to vfakt do
parallel
rot := anzahlrotblau[zaehlerp] div offset6;
blau := anzahlrotblau[zaehlerp] - rot * offset6;
endparallel;
rote := rote + reduce.sum(rot);
blaue := blaue + reduce.sum(blau);
end;
writestring('Rote Teilchen insgesamt: ');
writecard(rote,10);
writeln;
writestring('Blaue Teilchen insgesamt: ');
writecard(blaue,10);
writeln;
hilfs := 1;
parallel
for zaehler1 := 1 to 14 do
feld[zaehler1] := 0;
end;
for zaehler1 := 1 to vfakt do
hilfp[zaehler1] := Rote_Blaue_Teilchen[zaehler1];
end;
for hilfz := 1 to 7 do
for zaehler1 := 1 to vfakt do
if odd(hilfp[zaehler1]) then inc(feld[2*(hilfz) -1]);end;
hilfp[zaehler1] := hilfp[zaehler1] div 2;
if odd(hilfp[zaehler1]) then inc(feld[2*hilfz]);end;
hilfp[zaehler1] := hilfp[zaehler1] div 2;
end;
end;
for hilfz := 1 to 14 do
anzahlrb[hilfs] := reduce.sum(feld[hilfz]);
inc(hilfs);
end;
endparallel;
for hilfs := 1 to 14 do
if odd(hilfs) then writestring('Anzahl blauer Teilchen in Richtung ');
writecard((hilfs+1) div 2,3);
writestring(' :');
writecard(anzahlrb[hilfs],7);
writeln;
else writestring('Anzahl roter Teilchen in Richtung ');
writecard((hilfs) div 2,3);
writestring(' : ');
writecard(anzahlrb[hilfs],7);
writeln;
end;
end;
end pruefe;
(****************************************************************************)
(*** ***)
(*** Prozedur errorhandle ***)
(*** zur Fehlerbehandlung ***)
(*** ***)
(****************************************************************************)
procedure errorhandle (scalar fehler : integer);
begin
case fehler of
1 : writestring('Ausgabedatei laesst sich nicht oeffnen !');
writeln;
halt; |
2 : writestring('Eingabedatei laesst sich nicht oeffnen !');
writeln;
halt; |
3 : writestring('Ausgabedatei laesst sich nicht schliessen !');
writeln;
halt; |
4 : writestring('Fehler im Inputfile !!!');
writeln;
halt; |
5 : writestring('Falsche Dimensionsangabe des Gitters !');
writeln;
halt;
end;
end errorhandle;
(****************************************************************************)
procedure inputfileeinlesen(scalar var anzahlblasen,flaechen : cardinal;
scalar var geschwu0,geschwv0,reddichte,anteilrot : real;
scalar var geschwx,geschwy,dichtebl :real10;
scalar var radius,mittelpunktx,mittelpunkty: card10;
scalar var randoben,randunten,randrechts,randlinks : string10;
scalar var rechtecklinksuntenx,rechtecklinksunteny,rechteckseitea,
rechteckseiteb: card10;
scalar var dichteblr,geschwxr,geschwyr : real10;
scalar var anfangszeitpunkt,endzeitpunkt,bildabstand,
bildabstandgesch,erstesbild,erstesdruckbild : cardinal;
scalar var anzahlgemitteltx,anzahlgemittelty : cardinal);
scalar eingabepuffer : string80;
varname : string10;
virtpeesx, virtpeesy,
tmp, zaehler,
temp,
ueberlappx, timeout,
ueberlappy : cardinal;
begin
(* Initialisierung *)
geschwu0 := 0.; geschwv0 := 0.; reddichte := 0.;
anteilrot := 0.;
for zaehler := 1 to 10 do
geschwx[zaehler] := 0.; geschwy[zaehler] := 0.;
dichtebl[zaehler] := 0.; radius[zaehler] := 0;
mittelpunktx[zaehler] := 0; mittelpunkty[zaehler] := 0;
end;
openinput(inputfile);
openoutput(controlfile);
(* Kommentare ueberlesen *)
writestring('*****************************************************************');
writeln;
writestring('* *');
writeln;
writestring('* Inputfile for simulating a immiscible Fluids based on the *');
writeln;
writestring('* Lattice Gas Method *');
writeln;
writestring('* *');
writeln;
writestring('*****************************************************************');
writeln;writeln;writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until strcmp(eingabepuffer , ">>>BEGINN") = 0 ;
writestring(eingabepuffer);
writeln;
(* Titel des Programmlaufes lesen *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'T') and (eingabepuffer[2] = 'I') and (eingabepuffer[3] = 'T') and
(eingabepuffer[4] = 'E') and (eingabepuffer[5] = 'L'));
writeln;
writestring(eingabepuffer);
writestring(' ');
readstring(eingabepuffer);
(* Gittergroesse lesen *)
timeout := 0;
repeat
writestring(eingabepuffer);
writestring(' ');
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'G') and (eingabepuffer[2] = 'I') and (eingabepuffer[3] = 'T') and
(eingabepuffer[4] = 'T') and (eingabepuffer[5] = 'E') and (eingabepuffer[6] = 'R'));
writeln;writeln;
writestring(eingabepuffer);
writestring(' ');
readstring(varname);
writeln;
if streq(varname,"'IMAX") then
writestring('IMAX ');
readstring(varname);
readcard(virtpeesx);
writecard(virtpeesx,12);
(* if virtpeesx <> virtuellepesx then errorhandle(5);end;*)
end;
writestring(' GROESSE DES GITTERS IN X-RICHTUNG ');
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'JMAX");
writestring('JMAX ');
readstring(eingabepuffer);
readcard(virtpeesy);
writecard(virtpeesy,12);
(* if virtpeesy <> virtuellepesy then errorhandle(5);end;*)
writestring(' GROESSE DES GITTERS IN Y-RICHTUNG ');
writeln;writeln;
(* Anfangsbedingungen der Stroemung *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'A') and (eingabepuffer[2] = 'N') and (eingabepuffer[3] = 'F') and
(eingabepuffer[4] = 'A') and (eingabepuffer[5] = 'N') and (eingabepuffer[6] = 'G'));
timeout := 0;
repeat
writestring(eingabepuffer);writestring(' ');
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'BLASEN");
writeln;
writestring('BLASEN ');
readstring(varname);
readcard(anzahlblasen);
writecard(anzahlblasen,12);
writestring(' NUMBER OF BLUE DROPLETS');writeln;
(* Anzahl der Flaechen noch wichtig *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'FLAECHE='");
writestring('FLAECHE');
readcard(flaechen);
writecard(flaechen,12);
writestring(' NUMBER OF BLUE ');
writeln;writeln;
if (flaechen=0) and (anzahlblasen=0) then
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'M') and (eingabepuffer[2] = 'I') and (eingabepuffer[3] = 'S') and
(eingabepuffer[4] = 'C') and (eingabepuffer[5] = 'H') and (eingabepuffer[6] = 'U'));
writeln;writeln;
writestring(eingabepuffer);writeln;
(* Mischungsphase *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'U0E");
writestring('U0E ');
readstring(eingabepuffer);
readreal(geschwu0);
writereal(geschwu0,12);
writestring(' VELOCITY IN X-DIRECTION');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'V0E");
readstring(varname);
writestring('V0E ');
readreal(geschwv0);
writereal(geschwv0,12);
writestring(' VELOCITY Y-DIRECTION');
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'D0E");
writestring('D0E ');
readstring(varname);
readreal(reddichte);
writereal(reddichte,12);
writestring(' DICHTE FOR EACH CELL');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'AROT");
writestring('AROT ');
readstring(varname);
readreal(anteilrot);
writereal(anteilrot,12);
writestring(' RED PARTICLES FACTOR');writeln;
end;
if anzahlblasen>0 then
for zaehler := 1 to anzahlblasen do
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'B') and (eingabepuffer[2] = 'L') and (eingabepuffer[3] = 'A') and
(eingabepuffer[4] = 'S') and (eingabepuffer[5] = 'E'));
writestring(eingabepuffer);writestring(' ');
writecard(zaehler,2);writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'U0");
readstring(varname);
writestring('U0 ');
readreal(geschwx[zaehler]);
writereal(geschwx[zaehler],12);
writestring(' VELOCITY OF DROPLET IN X');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'V0");
writestring('V0 ');
readstring(varname);
readreal(geschwy[zaehler]);
writereal(geschwy[zaehler],12);
writestring(' VELOCITY OF DROPLET IN Y');
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'DBLAU");
writestring('DBLAU ');
readstring(varname);
readreal(dichtebl[zaehler]);
writereal(dichtebl[zaehler],12);
writestring(' GESAMTBELEGUNGSDICHTE OF THE BLUE DROPLET');
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'RADIUS");
writestring('RADIUS ');
readstring(varname);
readcard(radius[zaehler]);
writecard(radius[zaehler],12);
writestring(' RADIUS DER BLASE ');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'XPOS");
writestring('XPOS ');
readstring(varname);
readcard(mittelpunktx[zaehler]);
writecard(mittelpunktx[zaehler],12);
writestring(' MITTELPUNKT OF THE DROPLET IN X');
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'YPOS");
writestring('YPOS ');
readstring(varname);
readcard(mittelpunkty[zaehler]);
writecard(mittelpunkty[zaehler],12);
writestring(' MITTELPUNKT OF THE DROPLET IN Y');
writeln;
end;
end;
if flaechen>0 then
for zaehler := 1 to flaechen do
writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'F') and (eingabepuffer[2] = 'L') and (eingabepuffer[3] = 'A') and
(eingabepuffer[4] = 'E') and (eingabepuffer[5] = 'C'));
writestring(eingabepuffer);writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NX");
writestring('NX ');
readstring(varname);
readcard(rechtecklinksuntenx[zaehler]);
writecard(rechtecklinksuntenx[zaehler],12);
writestring(' BEGINN DER FLAECHE IN X-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'DX");
writestring('DX ');readstring(varname);
readcard(rechteckseitea[zaehler]);
writecard(rechteckseitea[zaehler],12);
writestring(' BREITE DER FLAECHE IN X-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NY");
writestring('NY ');readstring(varname);
readcard(rechtecklinksunteny[zaehler]);
writecard(rechtecklinksunteny[zaehler],12);
writestring(' BEGINN DER FLAECHE IN Y-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'DY");
writestring('DY ');readstring(varname);
readcard(rechteckseiteb[zaehler]);
writecard(rechteckseiteb[zaehler],12);
writestring(' BREITE DER FLAECHE IN Y-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'DBL");
writestring('DBL ');readstring(varname);
readreal(dichteblr[zaehler]);
writereal(dichteblr[zaehler],12);
writestring(' GESAMTBELEGUNGSDICHTE DER BLAUEN FLAECHE');writeln;
(* No use : ueberlesen *);
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'GSCHWV");
readstring(varname);
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'LWELB");
readstring(varname);
readcard(tmp);
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'U0B");
writestring('U0B ');
readstring(varname);
readreal(geschwxr[zaehler]);
writereal(geschwxr[zaehler],12);
writestring(' GESCHWINDIGKEIT DER FLAECHE IN X');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'V0B");
writestring('V0B ');
readstring(varname);
readreal(geschwyr[zaehler]);
writereal(geschwyr[zaehler],12);
writestring(' GESCHWINDIGKEIT DER FLAECHE IN Y');writeln;
end;
end;
(* Berechnungszeitraum etc. einlesen *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'B') and (eingabepuffer[2] = 'E') and (eingabepuffer[3] = 'R') and
(eingabepuffer[4] = 'E') and (eingabepuffer[5] = 'C'));
writeln;writestring(eingabepuffer);writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'IT0");
writestring('IT0 ');
readstring(varname);
readcard(anfangszeitpunkt);
writecard(anfangszeitpunkt,12);
writestring(' ANFANGSZEITPUNKT DER BERECHNUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'ITDIF");
writestring('ITDIF ');
readstring(varname);
readcard(endzeitpunkt);
writecard(endzeitpunkt,12);
writestring(' ANZAHL DER BERECHNETEN ZEITPUNKTE');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'BLDA");
writestring('BLDA ');
readstring(varname);
readcard(erstesbild);
writecard(erstesbild,12);
writestring(' ZEITPUNKT DES ERSTEN BILDES');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'BLPRDA");
writestring('BLPRDA ');
readstring(varname);
readcard(erstesdruckbild);
writecard(erstesdruckbild,12);
writestring(' ZEITPUNKT DES ERSTES DRUCKBILDES');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'BLDWER");
writestring('BLDWER ');
readstring(varname);
readcard(bildabstand);
writecard(bildabstand,12);
writestring(' ZEITDIFFERENZ DER BILDER');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'BLDDF");
writestring('BLDDF ');
readstring(varname);
readcard(bildabstandgesch);
writecard(bildabstandgesch,12);
writestring(' ZEITDIFFERENZ DER DRUCKBILDER');writeln;
(* Randbedingungen einlesen *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'R') and (eingabepuffer[2] = 'A') and (eingabepuffer[3] = 'N') and
(eingabepuffer[4] = 'D') and (eingabepuffer[5] = 'B'));
writeln;writestring(eingabepuffer);writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'RDLI='");
writestring('RDLI ');
readstring(randlinks);
writestring(randlinks);
writestring(' RANDBEDINGUNG LINKS');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'RDRE='");
writestring('RDRE ');
readstring(randrechts);
writestring(randrechts);
writestring(' RANDBEDINGUNG RECHTS');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'RDOB='");
writestring('RDOB ');
readstring(randoben);
writestring(randoben);
writestring(' RANDBEDINGUNG OBEN');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'RDUN='");
writestring('RDUN ');
readstring(randunten);
writestring(randunten);
writestring(' RANDBEDINGUNG UNTEN');writeln;
(* Mittelwerte einlesen *)
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until ((eingabepuffer[1] = 'M') and (eingabepuffer[2] = 'I') and (eingabepuffer[3] = 'T') and
(eingabepuffer[4] = 'T') and (eingabepuffer[5] = 'E'));
writeln;writestring(eingabepuffer);writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NXK='");
writestring('NXK ');
readcard(anzahlgemitteltx);
writecard(anzahlgemitteltx,12);
writestring(' ANZAHL PUNKTE IN X-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NYK='");
writestring('NYK ');
readcard(anzahlgemittelty);
writecard(anzahlgemittelty,12);
writestring(' ANZAHL PUNKTE IN Y-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NXU='");
writestring('NXU ');
readcard(ueberlappx);
writecard(ueberlappx,12);
writestring(' UEBERLAPPUNG IN X-RICHTUNG');writeln;
timeout := 0;
repeat
readstring(eingabepuffer);
inc(timeout);
if timeout = 100000 then errorhandle(4);end;
until streq(eingabepuffer,"'NYU='");
writestring('NYU ');
readcard(ueberlappy);
writecard(ueberlappy,12);
writestring(' UEBERLAPPUNG IN Y-RICHTUNG');writeln;
writeln;
writestring('>>>ENDE');
writeln;
writeln;writeln;
writestring('Eingabedaten vollstaendig gelesen !!');
writeln;
for timeout := 1 to 10 do writeln;end;
closeoutput;
closeinput;
end inputfileeinlesen;
(****************************************************************************)
(*procedure bildschirmausgabe(scalar selekt : cardinal);
scalar groessex, groessey,
offsetx, offsety : integer;
vector blau, rot : color;
hilf1, roteT, blaueT : cardinal;
begin
if selekt=0 then handle := OpenWindow(0.8,0.8);end;
if selekt=1 then Selectwindow(handle);end;
parallel
(* Farbskala fuer Schwarzweissausgabe *)
blau.red := 0;
blau.green := 0;
blau.blue := 0;
rot.red := max(cardinal);
rot.green := max(cardinal);
rot.blue:= max(cardinal);
offsetx := 0;
offsety := 0;
for hilf1 :=1 to vfakt do
roteT := anzahlrotblau[hilf1] div offset6;
blaueT := anzahlrotblau[hilf1] - roteT * offset6;
if roteT > blaueT
then setcolor(blau);
else setcolor(rot); end;
setpixel(dim1+offsetx,dim2+offsety);
offsetx := offsetx + maxnet;
if (hilf1 mod vfaktx) = 0 then offsetx := 0;
offsety := offsety + maxnet;
end;
end;
endparallel;
if selekt=2 then CloseWindow(handle); end;
end bildschirmausgabe; *)
(****************************************************************************)
begin
filezaehlers := 1;
filezaehlerrb := 1;
filezaehlerv := 1;
filezaehlerhilf := 0;
inputfileeinlesen(anzahlblasen,flaechen,geschwu0,geschwv0,reddichte,anteilrot,
geschwx,geschwy,dichtebl,radius,mittelpunktx,mittelpunkty,
randoben,randunten,randrechts,randlinks,rechtecklinksuntenx,
rechtecklinksunteny,rechteckseitea,rechteckseiteb,
dichteblr,geschwxr,geschwyr,anfangszeitpunkt,endzeitpunkt,bildabstand,
bildabstandgesch,erstesbild,erstesbildgesch,
anzahlgemitteltx,anzahlgemittelty);
if anfangszeitpunkt=1 then
writestring('initial state begin');
writeln;
anfangsbelegung(anzahlblasen,flaechen,geschwu0,geschwv0,reddichte,anteilrot,
geschwx,geschwy,dichtebl,radius,mittelpunktx,mittelpunkty,
randoben,randunten,randrechts,randlinks,rechtecklinksuntenx,
rechtecklinksunteny,rechteckseitea,rechteckseiteb,
dichteblr,geschwxr,geschwyr);
writestring('initial state end');
writeln;
else
writestring('loading snapshot begin');
writeln;
aufsetzer_einlesen;
writestring('loading snapshot end');
writeln;
end;
anzahl_rotblau;
pruefe;
(* bildschirmausgabe(0); *)
writestring('loading tables begin');
writeln;
einlesen;
writestring('loading tables end');
writeln;
(* saving initial state*)
writeln;
filefind(filestring,1);
writeln;
ausgabe_rot_blau(filestring);
for zaehlerglobal:= anfangszeitpunkt to endzeitpunkt do
if (zaehlerglobal >= erstesbild) and
(zaehlerglobal mod bildabstand = 0) then
writestring('counter :');
writecard(zaehlerglobal,5);
writestring(' ');
writeln;
filefind(filestring,1);
writeln;
ausgabe_rot_blau(filestring);
(*bildschirmausgabe(1); *)
end;
if (zaehlerglobal= erstesbildgesch) or
((zaehlerglobal >= erstesbildgesch) and
(zaehlerglobal mod bildabstandgesch = 0)) then
writestring('counter :');
writecard(zaehlerglobal,5);
writestring(' ');
filefind(filestring,2);
geschwindigkeit(filestring,anzahlgemitteltx,anzahlgemittelty);
end;
if zaehlerglobal mod 1000 = 0 then
writestring('schnappshot begin');
filefind(filestring,0);
schnappschuss(filestring);
end;
anzahl_rotblau;
kollision(randoben,randunten,randlinks,randrechts);
fortbewegung;
end;
pruefe;
(* bildschirmausgabe(2);*)
end ilg_10.